package cn.org.xwb.bookmall.admin.service.impl;

import cn.org.xwb.bookmall.admin.service.LoginService;
import cn.org.xwb.bookmall.model.po.Manager;
import cn.org.xwb.bookmall.model.service.impl.AllowMailServiceImpl;
import cn.org.xwb.bookmall.model.service.impl.ManagerServiceImpl;
import cn.org.xwb.bookmall.model.utils.BookCodeUtil;
import cn.org.xwb.bookmall.model.utils.BookRedisUtil;
import cn.org.xwb.bookmall.model.vo.ManagerVo;
import cn.org.xwb.bookmall.model.vo.UserVo;
import cn.org.xwb.common.model.vo.RespResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Objects;

@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    private AllowMailServiceImpl allowMailService;

    @Autowired
    private ManagerServiceImpl managerService;

    @Autowired
    private BookRedisUtil bookRedisUtil;

    @Autowired
    private BookCodeUtil bookCodeUtil;

    /**
     * 发送邮箱验证码
     *
     * @param mail
     * @return
     */
    @Override
    public RespResult<Object> sendMailCode(String mail) {
        // 判断该邮箱是否可以登录管理端
        Boolean judgeRes = allowMailService.judgeAllow(mail);
        if (Objects.isNull(judgeRes)) return RespResult.fail("系统发生异常，请刷新页面或稍后尝试");
        if (!judgeRes) return RespResult.fail("该邮箱无权登录管理端");
        // 查询管理员
        Manager manager = managerService.findAndGenManagerByMail(mail);
        // 管理员被禁用
        if (Objects.isNull(manager)) return RespResult.fail("抱歉，您暂时无权进行登录");
        // 判断是否可以再次获取
        // 不允许再次获取
        if (Objects.nonNull(bookRedisUtil.getLoginMailCodeAgainAdmin(mail)))
            return RespResult.fail("请勿频繁获取验证码");
        // 发送验证码
        if (!bookCodeUtil.sendCodeLoginAdmin(mail)) return RespResult.fail("发送验证码失败");
        return RespResult.success("发送验证码成功");
    }

    /**
     * 通过有效登录
     *
     * @param mail
     * @param code
     * @return
     */
    @Override
    public RespResult<Object> loginByMail(String mail, String code) {
        // 判断该邮箱是否可以登录管理端
        Boolean judgeRes = allowMailService.judgeAllow(mail);
        if (Objects.isNull(judgeRes)) return RespResult.fail("系统发生异常，请刷新页面或稍后尝试");
        if (!judgeRes) return RespResult.fail("该邮箱无权登录管理端");
        // 查询管理员
        Manager manager = managerService.findAndGenManagerByMail(mail);
        // 无权登录
        if (Objects.isNull(manager)) return RespResult.fail("抱歉，您暂时无权进行登录");
        // 查询验证码
        String code_cache = bookRedisUtil.getLoginMailCodeAdmin(mail);
        // 判断验证码是否有效
        RespResult<Object> respResult = BookCodeUtil.judgeCode(code, code_cache);
        // 验证码失效或错误
        if (Objects.nonNull(respResult)) return respResult;
        // 有权登录，且验证码有效和正确
        // 缓存账号信息
        // 失败
        if (!bookRedisUtil.cacheManager(manager)) return RespResult.fail("系统发生异常，请刷新页面或稍后重试");
        // 登录成功
        // 返回账号信息
        return RespResult.success("登录成功", new ManagerVo(manager));
    }

    /**
     * 判断登录是否有效
     *
     * @param account
     * @return
     */
    @Override
    public RespResult<Object> effective(String account) {
        // 获取并刷新缓存
        Manager manager = bookRedisUtil.getAndResetExpireAdmin(account);
        if (Objects.isNull(manager)) return RespResult.fail("登录失效，请重新进行登录");
        // 判断该邮箱是否可以登录管理端
        Boolean judgeRes = allowMailService.judgeAllow(manager.getMail());
        if (Objects.isNull(judgeRes)) return RespResult.fail("系统发生异常，请刷新页面或稍后尝试");
        if (!judgeRes) return RespResult.fail("该邮箱无权登录管理端");
        return RespResult.success("登录有效");
    }
}
